package com.gmrz.uap.util;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.poi.excel.ExcelWriter;
import cn.hutool.poi.excel.StyleSet;
import com.gmrz.uap.model.Authenticators;
import com.jfinal.kit.PathKit;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * @PACKAGE_NAME: com.gmrz.uap.util
 * @ClassName: ExcelUtil
 * @Description:
 * @Date: 2020-07-08 13:40
 * @Author: liyl@gmrz-bj.com
 **/
public class ExcelUtil {

    private static final Logger LOG = LogManager.getLogger(ExcelUtil.class);


    /**
     * 导出 Excel 表格
     * @param list
     * @return
     */
    public static String exportCertUseDetailExcel(List<Authenticators> list){
        if (list == null || list.size() ==0){
            return null;
        }
        ArrayList<Map<String, Object>> rows = new ArrayList<Map<String, Object>>();
        for (Authenticators authenticators : list){
            // 拼接导入Excel中内容
            Map<String, Object> row = new LinkedHashMap<>();
            row.put("用户名", authenticators.getCustNo());
            row.put("机构号", authenticators.getInstCode());
            row.put("渠道号", authenticators.getTenantId());
            row.put("认证方式", authenticators.getAuthType());
            row.put("设备标识", authenticators.getDeviceId());
            row.put("设备型号", authenticators.get("DEVICE_NAME"));
            row.put("设备厂商", authenticators.get("DEVICE_TYPE"));
            row.put("系统类型", authenticators.get("OS_TYPE"));
            row.put("系统版本", authenticators.get("OS_VERSION"));
            row.put("开通时间", authenticators.getCreatets());
            rows.add(row);
        }
        // 导出Excel
        String excelName = exportExcel(rows);
        return excelName;
    }


    /**
     * 导出 Excel
     * @param list
     * @return
     */
    public  static String exportExcel(ArrayList<Map<String, Object>> list){
        ArrayList<Map<String, Object>> rows = CollUtil.newArrayList(list);
        ExcelWriter writer = null;
        //ServletOutputStream out = null;
        try {
            // 导出文件的存放目录
            String filePath = PathKit.getWebRootPath() + File.separator + "exportExcelFile";
            File fileDir = new File(filePath);
            if (!fileDir.exists()) {
                fileDir.mkdir();
            }

            // 设置日期格式
            SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd_HH_mm_ss");
            String excelName = "CertUseDetail-"+ df.format(new Date()) +".xlsx";
            // 通过工具类创建writer,固定的文件输出路径
            writer = cn.hutool.poi.excel.ExcelUtil.getWriter(filePath + File.separator + excelName);

            // 定义第一行合并单元格样式
            CellStyle headCellStyle = writer.getHeadCellStyle();
            // 设置内容字体
            Font font = writer.createFont();
            // 加粗
            font.setBold(true);
            // 颜色
            font.setColor(Font.COLOR_RED);
            headCellStyle.setFont(font);

            // 设置第3 、8列的宽度，从零开始数列数
            writer.setColumnWidth(4, 60);
            writer.setColumnWidth(9, 17);
            //writer.setColumnWidth(5, 8);

            // 定义数据行的样式
            StyleSet style =  writer.getStyleSet();
            // 设置单元格文本内容换行
            style.setWrapText();

            // 合并单元格后的标题行，使用默认标题样式
            writer.merge(rows.get(0).size() - 1, "证书使用明细");
            // 一次性写出内容，使用默认样式，强制输出标题
            writer.write(rows, true);


            /*//response为HttpServletResponse对象
            this.getResponse().setContentType("application/vnd.ms-excel;charset=utf-8");
            //test.xls是弹出下载对话框的文件名，不能为中文，中文请自行编码
            this.getResponse().setHeader("Content-Disposition","attachment;filename=test.xls");
            out = this.getResponse().getOutputStream();

            writer.flush(out, true);*/

            // 返回生成的 Excel 文件名称
            return excelName;

        }catch (Exception e){
            LOG.error(e);
        }
        finally {
            if (writer != null){
                // 关闭writer，释放内存
                writer.close();
            }
        }
        return null;
    }

}
